<?php

namespace app\admin\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
use app\admin\model\ClassSequence;

class InitClassSequence extends Command
{
    protected function configure()
    {
        $this->setName('class_sequence:init')
            ->setDescription('Initialize class sequence table and assign sequence numbers')
            ->addOption('check', 'c', null, '只检查数据一致性，不进行修复')
            ->addOption('fix', 'f', null, '检查并修复数据一致性问题')
            ->addOption('force', null, null, '强制重新初始化所有序号');
    }

    protected function execute(Input $input, Output $output)
    {
        try {
            // 检查选项
            $checkOnly = $input->getOption('check');
            $fixOnly = $input->getOption('fix');
            $force = $input->getOption('force');
            
            // 检查表是否存在
            $tableExists = Db::query("SHOW TABLES LIKE 'fa_class_sequence'");
            
            // 如果只是检查数据一致性
            if ($checkOnly) {
                if (empty($tableExists)) {
                    $output->writeln("<error>班级序号表不存在，请先初始化表结构！</error>");
                    return false;
                }
                
                $output->writeln("开始检查数据一致性...");
                $inconsistencies = ClassSequence::checkConsistency();
                
                if (empty($inconsistencies)) {
                    $output->writeln("<info>数据一致性检查通过，未发现问题！</info>");
                } else {
                    $output->writeln("<warning>发现 " . count($inconsistencies) . " 个数据一致性问题：</warning>");
                    
                    $orphanedCount = 0;
                    $typeMismatchCount = 0;
                    $missingCount = 0;
                    
                    foreach ($inconsistencies as $item) {
                        switch ($item['type']) {
                            case 'orphaned_sequence':
                                $orphanedCount++;
                                break;
                            case 'type_mismatch':
                                $typeMismatchCount++;
                                break;
                            case 'missing_sequence':
                                $missingCount++;
                                break;
                        }
                    }
                    
                    if ($orphanedCount > 0) {
                        $output->writeln("- 孤立的序号记录: {$orphanedCount} 个");
                    }
                    if ($typeMismatchCount > 0) {
                        $output->writeln("- 类型不匹配: {$typeMismatchCount} 个");
                    }
                    if ($missingCount > 0) {
                        $output->writeln("- 缺失的班级序号: {$missingCount} 个");
                    }
                    
                    $output->writeln("使用 --fix 选项可以修复这些问题。");
                }
                
                return true;
            }
            
            // 如果只是修复数据一致性
            if ($fixOnly) {
                if (empty($tableExists)) {
                    $output->writeln("<error>班级序号表不存在，请先初始化表结构！</error>");
                    return false;
                }
                
                $output->writeln("开始修复数据一致性问题...");
                $result = ClassSequence::fixConsistency();
                
                $output->writeln("<info>修复完成！</info>");
                $output->writeln("- 删除孤立的序号记录: {$result['orphaned_removed']} 个");
                $output->writeln("- 修复类型不匹配: {$result['type_fixed']} 个");
                $output->writeln("- 添加缺失的班级序号: {$result['missing_added']} 个");
                
                return true;
            }
            
            // 正常初始化流程
            $output->writeln("开始初始化班级序号表...");
            
            // 读取SQL文件
            $sqlFile = APP_PATH . 'admin/sql/class_sequence.sql';
            if (!file_exists($sqlFile)) {
                $output->writeln("<error>SQL文件不存在: {$sqlFile}</error>");
                return false;
            }

            $sql = file_get_contents($sqlFile);
            
            // 先删除表（如果存在）
            $output->writeln("删除旧的班级序号表（如果存在）...");
            Db::execute("DROP TABLE IF EXISTS `fa_class_sequence`");
            
            // 执行SQL创建表
            $output->writeln("创建班级序号表...");
            Db::execute($sql);
            $output->writeln("<info>班级序号表创建成功！</info>");
            
            // 如果表已存在且不是强制重新初始化
            if (!empty($tableExists) && !$force) {
                $count = Db::table('fa_class_sequence')->count();
                if ($count > 0) {
                    $output->writeln("<warning>班级序号表已存在且包含数据，跳过初始化。</warning>");
                    $output->writeln("使用 --force 选项可以强制重新初始化所有序号。");
                    
                    // 检查数据一致性
                    $output->writeln("开始检查数据一致性...");
                    $inconsistencies = ClassSequence::checkConsistency();
                    
                    if (empty($inconsistencies)) {
                        $output->writeln("<info>数据一致性检查通过，未发现问题！</info>");
                    } else {
                        $output->writeln("<warning>发现 " . count($inconsistencies) . " 个数据一致性问题。</warning>");
                        $output->writeln("使用 --fix 选项可以修复这些问题。");
                    }
                    
                    return true;
                }
            }

            // 初始化班级序号
            $output->writeln("开始分配班级序号...");
            $result = ClassSequence::initializeSequences();
            
            if ($result) {
                $output->writeln("<info>班级序号分配成功！</info>");
            } else {
                $output->writeln("<error>班级序号分配失败！</error>");
                return false;
            }

            $output->writeln("<info>班级序号表初始化完成！</info>");
            return true;
        } catch (\Exception $e) {
            $output->writeln("<error>初始化过程中发生错误: " . $e->getMessage() . "</error>");
            return false;
        }
    }
}